49. TCP Communication

Note

The below information is extensively based in information taken from the PowerShell® Notes for Professionals book. I plan to extend this information based on my day to day usage of the language.

49.1: TCP listener

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Function Receive-TCPMessage {
  Param (
    [Parameter(Mandatory=$true, Position=0)]
    [ValidateNotNullOrEmpty()]
    [int] $Port
  )
  Process {
    Try {
      # Set up endpoint and start listening
      $endpoint = new-object System.Net.IPEndPoint([ipaddress]::any,$port)
      $listener = new-object System.Net.Sockets.TcpListener $EndPoint
      $listener.start()
      # Wait for an incoming connection
      $data = $listener.AcceptTcpClient()
      # Stream setup
      $stream = $data.GetStream()
      $bytes = New-Object System.Byte[] 1024
      # Read data from stream and write it to host
      while (($i = $stream.Read($bytes,0,$bytes.Length)) -ne 0){
        $EncodedText = New-Object System.Text.ASCIIEncoding
        $data = $EncodedText.GetString($bytes,0, $i)
        Write-Output $data
      }
      # Close TCP connection and stop listening
      $stream.close()
      $listener.stop()
    }
    Catch {
      "Receive Message failed with: `n" + $Error[0]
    }
  }
}

Start listening with the following and capture any message in the variable $msg:

1
$msg = Receive-TCPMessage -Port 29800

49.2: TCP Sender

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Function Send-TCPMessage {
  Param (
    [Parameter(Mandatory=$true, Position=0)]
    [ValidateNotNullOrEmpty()]
    [string]
    $EndPoint
    ,
    [Parameter(Mandatory=$true, Position=1)]
    [int]$Port
    ,
    [Parameter(Mandatory=$true, Position=2)]
    [string]
    $Message
  )
  Process {
    # Setup connection
    $IP = [System.Net.Dns]::GetHostAddresses($EndPoint)
    $Address = [System.Net.IPAddress]::Parse($IP)
    $Socket = New-Object System.Net.Sockets.TCPClient($Address,$Port)
    # Setup stream writer
    $Stream = $Socket.GetStream()
    $Writer = New-Object System.IO.StreamWriter($Stream)
    # Write message to stream
    $Message | % {
      $Writer.WriteLine($_)
      $Writer.Flush()
    }
    # Close connection and stream
    $Stream.Close()
    $Socket.Close()
  }
}

Send a message with:

1
Send-TCPMessage -Port 29800 - Endpoint 192.168.0.1 -message "My first TCP message !"

Note : TCP messages may be blocked by your software firewall or any external facing firewalls you are trying to go through. Ensure that the TCP port you set in the above command is open and that you are have setup the listener on the same port.